2023/12/231810字符
Reflect 反射
是指计算机程序在运行时可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。
优缺点:维基百科——反射式编程
API
const obj = {
a: 10,
b: 12
}
Reflect.set(obj, 'a', 100); // 设置对象属性: obj.a = 100
Reflect.get(obj, 'a'); // 获取对象属性
Reflect.deleteProperty(obj, 'b'); // 删除对象属性
Reflect.defineProperty(obj, 'a', { // 与 Object.defineProperty 的区别:Reflect.defineProperty 不会报错
value: 20 // 可以理解为 Object.defineProperty 就是调用了底层的 Reflect.defineProperty
}); //--> false
Reflect.has(obj, 'a'); // 是否存在: 'a' in obj
内置JS对象,仅ES6浏览器支持,可以访问一些底层的功能
apply
function fn (a, b) {
console.log(a, b);
}
// 函数、this指向、参数
Reflect.apply(fn, null, [3, 5]); // 函数调用: fn(3, 5);
构造函数
function Car (a, b) {
this.a = a;
this.b = b;
}
const car = Reflect.construct(Car, [1, 2]); // 构造函数: let car = new Car(1, 2);
- 不可构造,不能使用 new 进行调用
- 提供的 API 比 Object 更为丰富且使用起来更为语义化
- 所有的方法都是静态方法,类似于 Math。(静态方法是可以直接用类名.方法名去调用的;而实例方法是不可以的,必须要用实例才可以去调用)
- 部分方法和 Object.* 相同,但行为略微有所区别。譬如 Object.defineProperty(obj, name, desc) 在无法定义属性时,会抛出一个错误,而 Reflect.defineProperty(obj, name, desc) 则会返回 false